package com.cheng.example.book.advise151.chap5.client70;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;


/**
 * 建议70：子列表只是原列表的一个视图
 * <p>
 * <p>
 * 知识点：
 * 1、注意：subList产生的列表只是一个视图，所有的修改动作直接作用于原列表。
 * 2、ArrayList中的toArray方法
 * <p>
 * public Object[] toArray() {
 * return Arrays.copyOf(elementData, size);
 * }
 * <p>
 * 其实就是个数组的浅拷贝而已
 *
 *
 * <p>
 * 通过阅读这段代码，我们就非常清楚subList方法的实现原理了：它返回的SubList类也是AbstractList的子类，
 * 其所有的get、set、add、remove等都是在原始列表上的操作，
 * 它自身并没有生成一个新的数组或是链表，也就是子列表只是原列表的一个视图(View)而已。
 * 所有的修改动作都映射到了原列表上。
 */
public class Client70 {

//    public static void main(String[] args) {
//        List<String> list = Arrays.asList("abc");
//        System.out.println(list.getClass());
//        Object[] objArray = list.toArray();
//        System.out.println(objArray.getClass());
//
////        objArray[0] = new Object();
//    }


    public static void main(String[] args) {
        // 定义一个包含两个字符串的列表
//        List<String> c = new ArrayList<String>();
//        c.add("A");
//        c.add("B");
        List<String> c = Arrays.asList("abc");
        // 构造一个包含c列表的字符串列表
        List<String> c1 = new ArrayList<String>(c);

        Object[] strings = c1.toArray();
//        System.out.println(strings);


        // subList生成与c相同的列表
        List<String> c2 = c.subList(0, c.size());
        // c2增加一个元素
        c2.add("C");
        System.out.println("c==c1? " + c.equals(c1));
        System.out.println("c==c2? " + c.equals(c2));
    }


    /**
     * str和str1是相等的
     */
    public static void testStr() {
        String str = "AB";
        String str1 = new String(str);
        String str2 = str.substring(0) + "C";
        System.out.println("str==str1? " + str.equals(str1));
        System.out.println("str==str2? " + str.equals(str2));
    }


    /**
     *
     */
    @Test
    public void test() {
        String[] strings = {"1"};
        Object[] objects = strings;
        System.out.println(objects.getClass());
    }


    /**
     * 报错
     */
    @Test
    public void test1() {
        List<String> stringList = new ArrayList<>();
        List<Object> objectList = new ArrayList<>();
//        objectList = stringList;
    }


}